با سلام
نحوه inject کردن prepared statement ها بسیار سخت هست(در هر زبانی) و با رعایت چند نکته قابل حل هست، اما چطوری کلاس PDO در PHP قابلیت injection خواهد داشت، با یک مثال عملی با هم مورد رو بررسی می کنیم:
اگر هنگام کوئری collation بر روی GBK و BIG5 ست شده باشد امکان اینجکت وجود دارد ، برای تست میتونین نمونه کد زیر را اجرا کنید:
کد PHP:
$pdo->query('SET NAMES GBK');
$var = chr(0xbf) . chr(0x27) . " OR 1=1 /*";
$query = "SELECT * FROM test WHERE name = ? LIMIT 1";
$stmt = $pdo->prepare($query);
$stmt->execute(array($var));
که هنگام اجرا به این صورت خواهد شد:
کد PHP:
SELECT * FROM test WHERE name = '𖠂' OR 1=1 /*' LIMIT 1
برای اینکه این مشکل کاملاً فیکس بشه، نیاز هست که از utf-8 استفاده کنید و یا اگر نیاز به GBK داشتین ATTR_EMULATE_PREPARES رو آف کنید:
کد PHP:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
موضوعات مشابه:
علاقه مندی ها (Bookmarks)